package model

import (
	"encoding/json"
	"fmt"
)

type ComicResponse struct {
	Month string `json:"month"`
	Num int `json:"num"`
	Link string `json:"link"`
	Year string `json:"year"`
	News string `json:"news"`
	SafeTitle string `json:"safe_title"`
	Transcript string `json:"transcript"`
	Alt string `json:"alt"`
	Img string `json:"img"`
	Title string `json:"title"`
	Day string `json:"day"`
}

type Comic struct {
	Title string `json:"title"`
	Number int `json:"number"`
	Date string `json:"date"`
	Description string `json:"description"`
	Image string `json:"image"`
}

// FormattedDate 将日期相关的字段格式化为字符串
func (this *ComicResponse) FormattedDate() string {
	return fmt.Sprintf("%s-%s-%s", this.Year, this.Month, this.Day)
}

// Comic 将从 xkcd API 接收到的 ComicResponse 转换为我们需要的 Comic 结构体数据
func (this *ComicResponse) Comic() *Comic  {
	return &Comic{
		Title:       this.Title,
		Number:      this.Num,
		Date:        this.FormattedDate(),
		Description: this.Alt,
		Image:       this.Img,
	}
}

// Pretty 将 Comic 结构体转换为一个看起来更简洁的字符串, 以便输出
func (this *Comic) Pretty() string  {
	f :=`
标题: %s
编号: %s
日期: %s
描述: %s
图片: %s
	`
	s := fmt.Sprintf(
		f,
		this.Title,
		this.Number,
		this.Date,
		this.Description,
		this.Image,
		)
	return s
}

// JSON 将 Comic 结构体转换为 JSON, 用于输出
func (this *Comic)  JSON() string{
	s, err := json.Marshal(this)
	if err != nil{
		return ""
	}
	return string(s)
}
